/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package springconfiguracion;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 *
 * @author odeen
 */
/**
 *
 * @todo DisposableBean no se dispara el evento, revisar.
 */
public class PalindromoImpl implements Palindromo, BeanNameAware, BeanFactoryAware, ApplicationContextAware,InitializingBean, DisposableBean{
    private String cadena;

    public String getCadena() {
        return cadena;
    }

    public void setCadena(String cadena) {
        this.cadena = cadena;
    }

    public String ejecutar() {
        StringBuffer sb = new StringBuffer();
        for(int i = cadena.length()-1 ; i>=0 ; i--){
           sb.append(cadena.charAt(i));
        }
        return sb.toString();
    }

    //Eventos en la vida de un bean
    
    public void setBeanName(String nombre) {
        System.out.println("Nombre del bean: "+nombre);
    }

    public void setBeanFactory(BeanFactory fabrica) throws BeansException {
        System.out.println("Fabrica: "+fabrica.toString());
    }

    public void setApplicationContext(ApplicationContext aplicacion) throws BeansException {
        System.out.println("Aplicacion: "+aplicacion.toString());
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }

    public void inicializandoBean(){
        System.out.println("inicializandoBean");
    }

    public void destroy() throws Exception {
        System.out.println("Bean destruido");
    }

    public void destruyendoBean(){
        System.out.println("destruyendoBean");
    }

    /*
     * Los eventos en la vida de un bean:
     *  - Instanciación: Spring instancia el objeto.
     *  - Inyeccion: Spring inyecta las propiedades en el objeto.
     *  - Si implementa BeanAware se inyecta el nombre del bean, para logs, por ejemplo.
     *  - Si implementa BeanFactoryAware se inyecta la fabrica, para crear otros objetos desde el propio objeto, por ejemplo.
     *  - Si implementa ApplicationContextAware se inyecta el contexto de aplicación, para darnos acceso a los módulos de spring (jndi, mail, etc...)
     *  - Si implementa InitialingBean se invoca afterPropertiesSet(), para inicializar el bean.
     *  - Si hay métodos personalizados de inicialización del bean se invocan en este momento. (en el ejemplo inicializandoBean, definido en el xml)
     *  Bean disponible para ser usado
     *  Se cierra el contenedor
     *  - Si implementa DisposableBean se invoca destroy.
     *  - Si hay métodos personalizados de destrucción del bean se invocan en este momento. (en el ejemplo destruyendoBean, definido en el xml)
     */

}
